package etude.collecteur.impl;

import java.nio.charset.Charset;
import java.util.Date;
import java.util.regex.Pattern;

import etude.collecteur.Analyzeur;
import etude.collecteur.Statistic;


/**
 * Classe dont le but est de recuperer des donnees de type byte pour renvoyer dans un tableau de Statistic.
 * @author Tonio.
 *
 */
public class AnalyzeurFile implements Analyzeur {
	
	/**
	 * l'encoding UTF-8 des octets d'une chaîne de caractères.
	 */
	private static final Charset UTF8 = Charset.forName("UTF-8");
	
	private static final Pattern FIN_DE_LIGNE = Pattern.compile("\n");

	private static final Pattern DOUBLE_POINT = Pattern.compile(":");
	
	private static final Pattern SECTION = Pattern.compile("------------------------------------------------------\n");
	
	@Override
	public Statistic[] analyze(byte[] donnees) {
		
		String[] sections = extraireSections(donnees);
	
		// On prépare les objets retour
		Statistic[] stat = new Statistic[sections.length-2];
		
		// Fixer la date d'analyse à l'heure courante
		Date dateStatitic = new Date();
				
		// On ignore la première section ainsi que la dernière section
		for (int index = 1; index < (sections.length-1); index++) {
			
			// Et on analyse les sections en se basant sur les retours chariots
			String[] sectionLines = FIN_DE_LIGNE.split(sections[index]);
			
			// On instancie l'objet retour
			Statistic statistic = new Statistic();
			
			// On positionne les informations générales
			statistic.setIndex(index-1);
			statistic.setDateCollecte(dateStatitic);
			
			// On recherche des motifs connus parmi les lignes
			for (String ligne : sectionLines) {
				
				// pour les informations détaillées de statistiques
				analyserLigne(statistic, ligne);
			}
			
			// On place l'objet retour dans le tableau
			stat[index-1] = statistic;
		}
		
		return stat;
	}


	private void analyserLigne(Statistic statistic, String ligne) {
		// On sépare les lignes en couple clef/valeur
		String[] clefValeur = DOUBLE_POINT.split(ligne);
		
		// Il faut vérifier qu'on obtienne bien un couple clef/valeur suite à la séparation.
		if (clefValeur.length == 2) {
			
			// On internalise la référence
			// pour optimiser les comparaisons de String
			String clef = clefValeur[0].trim().intern();
			
			String valeur = clefValeur[1].trim();
			
			if ("Available Connections Count" == clef) {
				int availableCount = Integer.valueOf(valeur);
				statistic.setMaxConnexions(availableCount);
			}
			if ("Max Connections In Use Count" == clef) {
				int maxInUse = Integer.valueOf(valeur);
				statistic.setMaxConnexionsUsed(maxInUse);
			}
			if ("Connections In Use Count" == clef) {
				int InUseCount = Integer.valueOf(valeur);
				statistic.setConnexionsUsed(InUseCount);
			}
			if ("Average Block Time For Sub Pool" == clef) {
				int AverageBlockTIme = Integer.valueOf(valeur);
				statistic.setAverageWaitingConnexion(AverageBlockTIme);
			}
			if ("Maximum Wait Time For Sub Pool" == clef) {
				int AverageMaxBlockTIme = Integer.valueOf(valeur);
				statistic.setAverageMaxWaitingConnexion(AverageMaxBlockTIme);
			}
		}
	}


	private String[] extraireSections(byte[] donnees) {
		// Conversion en String de l'entrée
		String chaine = new String(donnees, UTF8);
		//System.out.println(chaine);
		// Recherche du motif <pre>...</pre>
		int debutPre = chaine.indexOf("<pre>")+"<pre>".length();
		int finPre = chaine.indexOf("</pre>", debutPre);
		// Extraction du contenu entre les balises <pre>
		String contenu = chaine.substring(debutPre, finPre);
		// Le contenu est découpé en sections
		// Chaque section est séparée par une ligne de tiret
		return SECTION.split(contenu);
	}
}

	

